#include "XmlTool.h"

CXmlTool::CXmlTool(void)
{
    //m_doc.Accept(&m_printer);
    m_root = NULL;
}

CXmlTool::~CXmlTool(void)
{
    Clear();
}

bool CXmlTool::LoadFile(const char *pFileName)
{
    if ( !m_doc.LoadFile(pFileName) )
    {
        return false;
    }
    return true;
}

bool CXmlTool::Load(const char *pXmlStr)
{
    m_doc.Parse(pXmlStr);

    return true;
}

TiXmlElement* CXmlTool::GetRoot()
{
    return m_doc.RootElement();
}

TiXmlElement* CXmlTool::GetChildElement( TiXmlElement *pParentElement, const char *szElementName )
{
    if (pParentElement)
    {
        return pParentElement->FirstChildElement(szElementName);
    }

    return NULL;
}

const char* CXmlTool::GetXmlElementValue( TiXmlElement *pParentElement, const char *szElementName )
{
    TiXmlElement* element;

    if (pParentElement)
    {
        element = pParentElement->FirstChildElement(szElementName);
        if (element && element->GetText())
        {
            return element->GetText();
        }
    }

    return "";
}

const char* CXmlTool::GetXmlElementValue(TiXmlElement *pElement)
{
    if (pElement && pElement->GetText())
    {
        return pElement->GetText();
    }

    return "";
}

void CXmlTool::CreateRoot(const char* szName)
{
    m_root = new TiXmlElement(szName);
    if (m_root)
    {
        m_doc.LinkEndChild(m_root);
    }
}

TiXmlElement* CXmlTool::AddElement(const char* szName)
{
    if (!m_root)
    {
        return NULL;
    }

    TiXmlElement* element = new TiXmlElement(szName);
    if (element)
    {
        m_root->LinkEndChild(element);
    }
    return element;
}

TiXmlElement* CXmlTool::AddElement(const char* szName, const char* szValue)
{
    TiXmlElement* element = new TiXmlElement(szName);
    if (element)
    {
        m_root->LinkEndChild(element);
        element->LinkEndChild(new TiXmlText(szValue));
    }
    return element;
}

TiXmlElement* CXmlTool::AddElement(const char* szName, int nValue)
{
    char szValue[32];
    itoa(nValue, szValue, 10);

    return AddElement(szName, szValue);
}

TiXmlElement* CXmlTool::AddElement( const char *szName, float fValue )
{
    char szValue[64] = {0};
    sprintf(szValue, "%f", fValue);

    return AddElement(szName, szValue);
}

TiXmlElement* CXmlTool::AddElement(const char* szName, unsigned long nValue)
{
    char szValue[32];
    ultoa(nValue, szValue, 10);

    return AddElement(szName, szValue);
}

TiXmlElement* CXmlTool::AddElement(const char* szName, unsigned __int64 nValue)
{
    char szValue[32];
    _ui64toa(nValue, szValue, 10);

    return AddElement(szName, szValue);
}

TiXmlElement* CXmlTool::AddElement(TiXmlElement* pParentNode, const char* szName)
{
    TiXmlElement* element = new TiXmlElement(szName);
    if (element)
    {
        pParentNode->LinkEndChild(element);
    }
    return element;
}

TiXmlElement* CXmlTool::AddElement(TiXmlElement* pParentNode, const char* szName, const char* szValue)
{
    TiXmlElement* element = new TiXmlElement(szName);
    if (element)
    {
        pParentNode->LinkEndChild(element);
        element->LinkEndChild(new TiXmlText(szValue));
    }
    return element;
}

TiXmlElement* CXmlTool::AddElement(TiXmlElement* pParentNode, const char* szName, int nValue)
{
    char szValue[32];
    itoa(nValue, szValue, 10);

    return AddElement(pParentNode, szName, szValue);
}




TiXmlElement* CXmlTool::AddElement(TiXmlElement* pParentNode, const char* szName, unsigned long nValue)
{
    char szValue[32];
    ultoa(nValue, szValue, 10);

    return AddElement(pParentNode, szName, szValue);
}


TiXmlElement* CXmlTool::AddElement( TiXmlElement *pParentNode, const char *szName, float fValue )
{
    char szValue[64] = {0};
    sprintf(szValue, "%f", fValue);

    return AddElement(pParentNode, szName, szValue);
}

TiXmlElement* CXmlTool::AddElement(TiXmlElement* pParentNode, const char* szName, unsigned __int64 nValue)
{
    char szValue[32];
    _ui64toa(nValue, szValue, 10);

    return AddElement(pParentNode, szName, szValue);
}

TiXmlElement* CXmlTool::AddElement( TiXmlElement *pParentNode, const char *szName, unsigned int nValue )
{
    return AddElement(pParentNode,szName,(unsigned long)nValue);
}

void CXmlTool::CreateXmlStr()
{
    m_doc.Accept(&m_printer);
}

unsigned long CXmlTool::StrLen()
{
    return m_printer.Size();
}

const char* CXmlTool::CStr()
{
    return m_printer.CStr();
}

void CXmlTool::Clear()
{
    m_root = NULL;
    m_doc.Clear();
}

void CXmlTool::SaveToFile( const char *pFileName )
{
    m_doc.SaveFile( pFileName );
}